<?php
	class Security {

		function __construct($db) {
			$this->db = $db;
		}




		##################################
		# cookie filltering              #
		##################################

		function set_cookie_check() {
			Cookier::set('gate_in', Cipher::encrypt(TRUE));
			//Nlog::xmp('set');
		}

		function run_cookie_check(){
			(Cipher::decrypt( Cookier::get('gate_in') ) != TRUE) ? Mover::error('잘못된 접근 입니다.') : '';
		}





		##################################
		# individual_access              #
		##################################

		# 파일 단일 접근 금지.
		function individual_access() {
			(!defined("PROJECT_NAME")) ? Mover::error('잘못된 접근 입니다.') : '';
		}





		##################################
		# ip filltering                  #
		##################################

		//*/
		# 모드를 가져온다
		function get_ipfilltering_mode() {
			//$mode = $this->db->q(sprintf("SELECT mode FROM `ggo_cfg_ip_filltering` GROUP BY `mode`"));
			//$modearr = array();
			//foreach($mode as $key=>$val){
			//	$modearr[] = $val['mode'];
			//}
			//return $modearr;
			$retarr = array(
				'admin', 'users'
			);
			return $retarr;
		}
		//*/

		//*/
		# 타입을 가져온다
		function get_ipfilltering_type(){
			//$type = $this->db->q(sprintf("SELECT type FROM `ggo_cfg_ip_filltering` GROUP BY `type`"));
			//$typearr = array();
			//foreach($type as $key=>$val){
			//	$typearr[] = $val['type'];
			//}
			//return $typearr;
			$retarr = array(
				'deny', 'allow'
			);
			return $retarr;
		}
		//*/

		# 해당 타입/모드에 따른 대상 아이피들 리턴
		function get_ipfilltering_ip_in_type_and_mode($type, $mode){
			$res = $this->db->gets($que=sprintf("SELECT * FROM `ggo_cfg_ip_filltering` WHERE `type`='%s' AND `mode`='%s'", $type, $mode));
			//Nlog::puts($res);
			if($res['has'] && $res['cnt'] > 0){
				foreach($res['res'] as $key=>$val){
					$ret[$key]['uid'] = $val['uid'];
					$ret[$key]['ip'] = $val['ip'];
				}
				return $ret;
			}

			return FALSE;
			//Nlog::puts($ret);
		}

		# 해당 모드와 타입에 아이피를 세팅한다.
		function set_ipfilltering($pmap){
			$ret1 = $this->db->que($que = sprintf("INSERT INTO `ggo_cfg_ip_filltering` SET `mode` = '%s', `type` = '%s', `ip` = '%s' ;\n", $pmap['mode'], $pmap['type'], $pmap['ip']));
			//Nlog::xmp($ret1);
			if($ret1['has']){
				$cnt = 1;
			} else {
				$cnt = 0;
			}
			return $cnt;
		}

		# 해당 ipfilltering 내역을 삭제한다.
		function delete_ipfilltering($pmap){
			$cnt = 0;
			foreach($pmap as $key=>$val){
				$ret = $this->db->get($que=sprintf("SELECT * FROM `ggo_cfg_ip_filltering` WHERE `uid` = %d;", $val['uid']));
				if($ret['has']){
					$retd = $this->db->que($que = sprintf("DELETE FROM `ggo_cfg_ip_filltering` WHERE `uid` = %d;", $val['uid']));
					if($retd['has']){
						$cnt += (int)$retd['affected'];
					}
				}

			}
			return $cnt;
		}

		# 대상의 아이피를 현재 애플리케이션의 모드를 확인 후 타입에 따라 확인 한다.
		# deny->allow 순서로 확인되며 override되지 않는다.
		function run_ipfilltering_mode($mode, $remote_addr){
			//Nlog::puts('mode',$mode);
			//Nlog::puts($remote_addr);

			$deny = $this->get_ipfilltering_ip_in_type_and_mode('deny', $mode);
			//Nlog::puts('deny', $deny);
			# deny가 설정 되어있을 경우만 동작
			if($deny != FALSE){
				foreach($deny as $key=>$val){
					$deny_ip_arr[] = $val['ip'];
				}
				//Nlog::puts('$deny_ip_arr',$deny_ip_arr);
				foreach($deny_ip_arr as $key=>$val){
					$patt = str_replace(".", "\.", $val);
					$pat = 	$pat = "/^{$patt}/";
					$is_deny = preg_match($pat, $remote_addr);
					if($is_deny){
						Mover::error("접근불가");
						exit();
					}
				}
			}

			$allow = $this->get_ipfilltering_ip_in_type_and_mode('allow', $mode);
			//Nlog::puts('$allow', $allow);
			# allow가 설정 되어있을 경우만 동작.
			if($allow != FALSE){
				foreach($allow as $key=>$val){
					$allow_ip_arr[] = $val['ip'];
				}
				//Nlog::puts('$allow_ip_arr', $allow_ip_arr);
				foreach($allow_ip_arr as $key=>$val){
					$patt = str_replace(".", "\.", $val);
					$pat = 	$pat = "/^{$patt}/";
					$is_allow = preg_match($pat, $remote_addr);
					if($is_allow){
						$allowed[] = 'allow';
						//Nlog::puts("allow");
					} else {
						$allowed[] = 'deny';
						//Nlog::puts("deny");
					}
				}
				//Nlog::puts('$allowed',$allowed);
				$is_allowed = in_array('allow', $allowed);
				if($is_allowed){
					//Nlog::puts('result', '접근허용');
					return TRUE;
				} else {
					Mover::error("접근불가");
					exit();
				}
			}
			# 설정 되어있지 않은 경우에는 허용한다.
			return TRUE;
		}

		/*/
		# 해당 타입에 따른 대상 아이피들 리턴
		function get_ipfilltering_ip_in_type($type){
			$res = $this->db->gets($que=sprintf("SELECT * FROM `ggo_cfg_ip_filltering` WHERE `type`='%s'", $type));
			//Nlog::puts($res);
			if($res['has'] && $res['cnt'] > 0){
				foreach($res['res'] as $key=>$val){
					$ret[$key]['uid'] = $val['uid'];
					$ret[$key]['ip'] = $val['ip'];
				}
				return $ret;
			}
			//Nlog::puts($ret);
		}
		//*/

		/*/
		# 해당 모드에 따른 대상 아이피들 리턴
		function get_ipfilltering_ip_in_mode($mode){
			$res = $this->db->gets($que=sprintf("SELECT * FROM `ggo_cfg_ip_filltering` WHERE `mode`='%s'", $mode));
			//Nlog::puts($res);
			if($res['has'] && $res['cnt'] > 0){
				foreach($res['res'] as $key=>$val){
					$ret[$key]['uid'] = $val['uid'];
					$ret[$key]['ip'] = $val['ip'];
				}
				return $ret;
			}
			//Nlog::puts($ret);
		}
		//*/

	}
?>